package cn.kz.hrm.service.impl;

import cn.kz.hrm.commonfeiclient.CommonFeignClient;
import cn.kz.hrm.domain.CourseType;
import cn.kz.hrm.domain.Shopcar;
import cn.kz.hrm.dto.CourseDto;
import cn.kz.hrm.dto.ShopCarDto;
import cn.kz.hrm.feignclients.CourseClientsFeign;
import cn.kz.hrm.mapper.ShopcarMapper;
import cn.kz.hrm.service.IShopcarService;
import cn.kz.hrm.util.AjaxResult;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author kz
 * @since 2020-07-13
 */
@Service
public class ShopcarServiceImpl extends ServiceImpl<ShopcarMapper, Shopcar> implements IShopcarService {

    @Autowired
    private CourseClientsFeign courseClientsFeign;

    @Autowired
    private CommonFeignClient commonFeignClient;


    /**
     * 添加购物车信息，
     * 根据传递的当前用户的id和课程id，利用feign进行查询课程的信息，然后将信息进行添加到shopcar表中，和当前用户进行关联。
     *
     * @param shopCarDto
     */
    @Override
    public void saveShopCar(ShopCarDto shopCarDto) {
        //调用feign接口进行查询课程的信息。
        AjaxResult ajaxResult = courseClientsFeign.getCourseById(shopCarDto.getCourseId());
        if (!ajaxResult.isSuccess() || ajaxResult.getResultObj() == null) {
            throw new RuntimeException("查找课程失败！");
        }
        //将格式从json格式转换成object然后再转换成CourseDto对象。
        String jsonString = JSON.toJSONString(ajaxResult.getResultObj());
        CourseDto courseDto = JSON.parseObject(jsonString, CourseDto.class);
        Float coursePrice = courseDto.getCourseMarket().getPrice();
        String courseName = courseDto.getCourse().getName();
        String coursePic = courseDto.getCourse().getPic();

        //在保存的时候进行判断是否有添加过该课程。
        //查询所有的课程的id，然后与要添加的课程做比较，有则提示，没有则添加到数据库中。
        List<Long> courseIds = baseMapper.geTAllCourseId(shopCarDto.getUserId());
        for (Long courseId : courseIds) {
            System.out.println(courseId + "查看课程的id数值。");
        }
        for (Long courseId : courseIds) {
            if (shopCarDto.getCourseId() == courseId.longValue()) {//证明已经添加了课程，提示！
                throw new RuntimeException("重复添加该课程！");
            }
        }
        //将课程信息保存到Shopcar中。
        Shopcar shopCar = new Shopcar();
        shopCar.setEmployeeId(shopCarDto.getUserId());//当前登录用户的id
        shopCar.setName(courseName);
        shopCar.setPrice(coursePrice);
        shopCar.setPic(coursePic);
        shopCar.setCourseId(shopCarDto.getCourseId());
        baseMapper.insert(shopCar);


        //查找所有的数据，进行重新添加到redis中。
        //重新将数据添加到list集合，再次存入进去。
        List<Shopcar> shopCarList = new ArrayList<>();
        //根据用户的id进行查找所有的该用户的所拥有的购物车清单。
        List<Shopcar> allShopCar = baseMapper.getAllShopCar(shopCarDto.getUserId());
        if (allShopCar.size() != 0) {//证明是数据库中有数据
            //将该购物车的清单，然后转换成json格式的数据，存入到redis中
            for (Shopcar shopcar : allShopCar) {
                shopCarList.add(shopcar);
            }
        }
        shopCarList.add(shopCar);
        //将课程添加到redis中，每一次的添加都要把之前的redis删除掉。
        String key = "shopcar_userid_" + shopCarDto.getUserId();//shopcar_1 key的样式。
        //将数据变为json格式。
        String toJSONString = JSON.toJSONString(shopCarList);
        //将redis中的存储数据删除
        deleteRedis(key);
        //将新的数据保存到Redis中。
        AjaxResult ajaxResult1 = commonFeignClient.setRedisOutTime(key, 60000, toJSONString);
        if (!ajaxResult.isSuccess()) {//没有存储进入redis中。
            //存储没有存储进去无所谓，后面可以从redis中进行查询，redis中没有则从直接从mysql中进行查询。
        }


        /*//将课程添加到redis中，每一次的添加都要把之前的redis删除掉。
        String key = "shopcar_userid_" + shopCarDto.getUserId();//shopcar_1 key的样式。
        AjaxResult ajaxResult3 = commonFeignClient.getRedis(key);
        //删除redis中的购物车数据
        AjaxResult ajaxResult2 = commonFeignClient.deleteRedis(key);
        //删除redis成功，或者根据key获取不到value值，则证明删除成功，或者没有key对应的value值。
        if (ajaxResult2.isSuccess() && ajaxResult2.getResultObj() == null) {
            if (ajaxResult3.getResultObj() != null) {
                Object resultObj = ajaxResult3.getResultObj();
//String toJSONString1 = JSON.toJSONString(resultObj);
                String toJSONString1 = JSON.toJSON(resultObj).toString();
                List<Shopcar> shopcarToRedis = JSON.parseArray(toJSONString1, Shopcar.class);
                //同时将购物车的信息添加到redis中，以登录用户的id进行命名。
//            String toJSONString = JSONArray.toJSONString(ajaxResult3.getResultObj());
//            List<Shopcar> shopcars = JSON.parseArray(toJSONString, Shopcar.class);
                for (Shopcar shopcar : shopcarToRedis) {
                    shopCarList.add(shopcar);
                }
            }
            shopCarList.add(shopCar);
            //将数据变为json格式。
            String toJSONString = JSON.toJSONString(shopCarList);
            //key值，过期时间，value值。
            AjaxResult ajaxResult1 = commonFeignClient.setRedisOutTime(key, 60000, toJSONString);
            if (!ajaxResult.isSuccess()) {//没有存储进入redis中。
                //存储没有存储进去无所谓，后面可以从redis中进行查询，redis中没有则从直接从mysql中进行查询。
            }
        }*/
    }

   /* @Override //查询所有的数据从mysql中
    public List<Shopcar> getAllShopCar(Long id) {
        return baseMapper.getAllShopCar(id);
    }*/


    /**
     * 删除redis。每一次修改和添加删除之后都需要重置redis。
     */
    private void deleteRedis(String key) {
        AjaxResult ajaxResult = commonFeignClient.deleteRedis(key);
        if (!ajaxResult.isSuccess()) {
            //清除缓存失败，如果可以存在脏数据的话，就不用抛出异常，不能就抛出异常。让事务回滚
        }
    }


    @Override
    public List<Shopcar> getAllShopCar(Long id) {
        //根据key去redis中查询value
        String key = "shopcar_userid_" + id;//shopcar_1 key的样式。
        AjaxResult courseTypeStr = commonFeignClient.getRedis(key);
        if (courseTypeStr.getResultObj() != null && courseTypeStr.isSuccess()) { //证明是redis中存在。转化数据类型类型进行转换，
            //存储进去的json数据，需要转换成集合对象
            String toJSONStrToRedis = JSON.toJSON(courseTypeStr.getResultObj()).toString();
            List<Shopcar> shopcarList = JSON.parseArray(toJSONStrToRedis, Shopcar.class);
            return shopcarList;
        } else {
            //@todo 去数据库中查询 水平查询所有的数据。根据当前登陆用户的id去查找。
            List<Shopcar> allShopCar = baseMapper.getAllShopCar(id);
            String courseTypesString = JSON.toJSONString(allShopCar);
            //向redis中再存储一份。
            AjaxResult key_course_type = commonFeignClient.setRedis(key, courseTypesString);
            return allShopCar;
        }
    }

    @Override
    public void deleteShopCar(ShopCarDto shopCarDto) {
        //根据key去redis中查询value
        String key = "shopcar_userid_" + shopCarDto.getUserId();//shopcar_1 key的样式。
        //根据课程的id进行删除数据
        baseMapper.removeById(shopCarDto.getCourseId());
        //重置redis。
        deleteRedis(key);
    }
}
